package com.nine.algorithm.queue;

import java.util.Iterator;

/**
 * @author nine
 * @version 1.0
 * @description 环形数组实现队列
 * @date 24/5/9 22:10
 */
public class ArrayQueue1<E> implements Queue<E>, Iterable<E> {

	private E[] array;

	// 环形数组头尾节点
	private int head = 0;
	private int tail = 0;

	@SuppressWarnings("all")
	public ArrayQueue1(int capacity) {
		// 容量需要是实际的+1，最后一个节点的位置，放尾节点指针
		array = (E[]) new Object[capacity + 1];
	}

	/**
	 * 向队列尾插入值
	 *
	 * @param value 待插入值
	 * @return 插入成功返回true，失败false
	 */
	@Override
	public boolean offer(E value) {
		if (isFull()) {
			return false;
		}
		array[tail] = value;
		tail = (tail + 1) % array.length;
		return true;
	}

	/**
	 * 从队列头获取值，并移除
	 *
	 * @return 如果队列非空，返回对头值，否则null
	 */
	@Override
	public E poll() {
		if (isEmpty()) {
			return null;
		}
		E value = array[head];
		head = (head + 1) % array.length;
		return value;
	}

	/**
	 * 从队列头获取值，不移除
	 *
	 * @return 如果队列非空，返回对头值，否则null
	 */
	@Override
	public E peek() {
		if (isEmpty()) {
			return null;
		}
		return array[head];
	}

	/**
	 * 检查队列是否为空
	 *
	 * @return 空：true，非空：false
	 */
	@Override
	public boolean isEmpty() {
		return head == tail;
	}

	/**
	 * 检查队列是否已满
	 *
	 * @return 满，返回true，否则false
	 */
	@Override
	public boolean isFull() {
		return (tail + 1) % array.length == head;
	}

	@Override
	public Iterator<E> iterator() {
		return new Iterator<E>() {
			int p = head;

			@Override
			public boolean hasNext() {
				return p != tail;
			}

			@Override
			public E next() {
				E value = array[p];
				p = (p + 1) % array.length;
				return value;
			}
		};
	}
}
